package com.hrm.system.service;

import com.hrm.common.utils.IdWorker;
import com.hrm.domain.system.Role;
import com.hrm.domain.system.User;
import com.hrm.system.dao.RoleDao;
import com.hrm.system.dao.UserDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import java.util.*;

/**
 * @Author: 林海湾Sea
 * @Date :  2021/11/25 19:30
 * @Decription: 企业员工操作业务逻辑层
 */
@Service
public class UserService {

    @Autowired
    private IdWorker idWorker;

    @Autowired
    private UserDao userDao;

    @Autowired
    private RoleDao roleDao;

    /**
     * 1、添加企业员工
     */
    public void addUser(User user) {

        //1、设置员工id
        String id = idWorker.nextId()+"";
        user.setId(id);
        user.setPassword("123456");
        // 员工启用状态
        user.setEnableState(1);
        userDao.save(user);
    }

    /**
     * 2、更新企业员工
     */
    public void update(User user) {

        // 1、根据员工id，查找未修改之前的员工
        User targetUser = userDao.findById(user.getId()).get();
        // 2、设置员工部门信息
        targetUser.setUsername(user.getUsername());
        targetUser.setPassword(user.getPassword());
        targetUser.setDepartmentId(user.getDepartmentId());
        targetUser.setDepartmentName(user.getDepartmentName());
        // 3、保存更新的员工信息
        userDao.save(targetUser);
    }

    /**
     * 3、根据Id查询企业员工
     */
    public User findById(String id) {
        User user = userDao.findById(id).get();
        return user;
    }

    /**
     * 4、查询全部用户列表
     *    参数：map集合形式
     *    hasDept:     是否分配部门，0：未分配，1：已分配
     *    departmentId:部门id
     *    companyId:   公司id
     */
    public Page<User> finaAll(Map<String, Object> map, int page, int size) {
        // 1、构造查询条件
        Specification<User> spec = new Specification<User>() {
            /**
             * 动态拼接实现查询条件
             * @param root
             * @param criteriaQuery
             * @param criteriaBuilder
             * @return
             */
            @Override
            public Predicate toPredicate(Root<User> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {

                List<Predicate> list = new ArrayList<>();
                // 根据请求的companyId是否为空构造查询条件
                if (!StringUtils.isEmpty(map.get("companyId"))) {
                    list.add(criteriaBuilder.equal(root.get("companyId").as(String.class),map.get("companyId")));
                }
                // 根据请求额部门id构造查询条件
                if (!StringUtils.isEmpty(map.get("departmentId"))) {
                    list.add(criteriaBuilder.equal(root.get("departmentId").as(String.class),map.get("departmentId")));
                }
                // 根据请求的hasDept判断，是否分配部门 0未分配(departmentId = null), 1已分配（department != null）
                if (!StringUtils.isEmpty(map.get("hasDept"))) {
                    if ("0".equals(map.get("hasDept"))) {
                        list.add(criteriaBuilder.isNull(root.get("departmentId")));
                    } else {
                        list.add(criteriaBuilder.isNotNull(root.get("departmentId")));
                    }
                }
                return criteriaBuilder.and(list.toArray(new Predicate[list.size()]));
            }
        };

        // 2、分页
        Page<User> pageUser = userDao.findAll(spec, new PageRequest(page-1, size));
        return pageUser;
    }

    /**
     * 5、根据id删除企业员工
     */
    public void deleteUser(String id) {
        userDao.deleteById(id);
    }


    /**
     * 分配角色
     * @param userId： 用户id
     * @param roleIds：要分配的角色id
     */
    public void assignRoles(String userId, List<String> roleIds) {
        // 1、根据id查询用户
        User user = userDao.findById(userId).get();
        // 2、用于存放角色的集合
        Set<Role> roles = new HashSet<>();
        for (String roleId: roleIds) {
            Role role = roleDao.findById(roleId).get();
            roles.add(role);
        }
        // 给用户设置添加的角色
        user.setRoles(roles);
        // 3、更新用户
        userDao.save(user);
    }

    /**
     * 通过用户电话-查询用户
     * @param mobile
     * @return
     */
    public User findByMobile(String mobile) {
        User user = userDao.findByMobile(mobile);
        return user;
    }

}
